package br.uvv.sao.rn;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import br.uvv.sao.dao.AlunoDAO;
import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.Perfil;
import br.uvv.sao.enums.SituUsuario;
import br.uvv.sao.util.MsgUtil;

public class AlunoRN implements Serializable {

	private static final long serialVersionUID = -4037585522949174116L;
	
	private AlunoDAO alunoDAO = new AlunoDAO();
	
	public Aluno carregar(Long id){
		return this.alunoDAO.get(id);
	}
	
	public String gerarCodigo(){
		String matricula = "AL";
		matricula += new SimpleDateFormat("yyMM").format(new Date());
		Long tempInt = (alunoDAO.listarUltimoIndice() + 1);
		String tempStr = tempInt.toString();
		while (tempStr.toString().length()<5){
			tempStr = "0" + tempStr; 
		}
		matricula += tempStr;
		return matricula;
	}
	
	public Boolean salvar(Aluno alunoInstance){
		if (alunoInstance.getId() == null || alunoInstance.getId() == 0){
			alunoInstance.setSituacao(SituUsuario.Ativo);
			alunoInstance.setPerfil(alunoDAO.getPerfilAluno());
			if(alunoInstance.getPerfil() != null && alunoInstance.getPerfil().getId() != null && alunoInstance.getPerfil().getId() > 0){
				this.alunoDAO.salvar(alunoInstance);
				String retorno = alunoDAO.getMensagemRetorno();
				if(retorno.contains("ERRO:")){
					MsgUtil.msgError(retorno);
					return false;
				}else{
					MsgUtil.msgInfo(retorno);
					return true;
				}
			}else{
				MsgUtil.msgError("ERRO: Selecione um perfil para o usuário!");
				return false;
			}
		} else {
			this.alunoDAO.atualizar(alunoInstance);
			String retorno = alunoDAO.getMensagemRetorno();
			if(retorno.contains("ERRO:")){
				MsgUtil.msgError(retorno);
				return false;
			}else{
				MsgUtil.msgInfo(retorno);
				return true;
			}
		}
	}
	
	public String excluir(Aluno alunoInstance){
		if(alunoInstance.getId() != null){
			this.alunoDAO.excluir(alunoInstance);
			return alunoDAO.getMensagemRetorno();
		}else{
			return alunoDAO.getMensagemRetorno();
		}
	}
	
	public String alterarSenha(Aluno alunoInstance, String senhaAtual, String novaSenha, String senhaConfirm){
		if(alunoInstance != null && alunoInstance.getId() != null && alunoInstance.getSenha().equals(senhaAtual)){
			if(novaSenha.equals(senhaConfirm)){
				alunoInstance.setSenha(novaSenha);
				salvar(alunoInstance);
				return alunoDAO.getMensagemRetorno();
			}else{
				return "ERRO: As senhas informadas são diferentes.";
			}
		}else{
			return "ERRO: Senha informada inválida.";  
		}
	}
	
	public boolean verificarEmail(Aluno alunoInstance){
		Aluno retorno = alunoDAO.findByEmail(alunoInstance.getEmail());
		if(retorno != null && retorno.getId() != null && alunoInstance.getId() != retorno.getId()){
			return true;
		}else{
			return false;
		}
	}
	
	public Boolean verificarEmail(String email, Aluno alunoInstance){
		Aluno retorno = alunoDAO.findByEmail(email);
		if(retorno != null && retorno.getId() != null){
			if(alunoInstance.getId() != null){
				if(!alunoInstance.getId().equals(retorno.getId())){
					return true;
				}else{
					return false;
				}
			}else{
				return true;
			}
		}else{
			return false;
		}
	}
	
	public Boolean verificarNome(String nome, Aluno alunoInstance){
		Aluno retorno = alunoDAO.findByNome(nome);
		if(retorno != null && retorno.getId() != null){
			if(alunoInstance.getId() != null){
				if(!alunoInstance.getId().equals(retorno.getId())){
					return true;
				}else{
					return false;
				}
			}else{
				return true;
			}
		}else{
			return false;
		}
	}
	
	public List<Aluno> filtrar(String nome){
		return alunoDAO.filtrar(nome);
	}
	
	public List<Aluno> listar(){
		return this.alunoDAO.listar();
	}

	public List<Perfil> listarPerfis() {
		return this.alunoDAO.listarPerfis();
	}
}
